package com.yf.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yf.mapper.system.SysRoleMenuMapper;
import com.yf.model.system.entity.SysRoleMenu;
import com.yf.service.ISysRoleMenuService;
import com.yf.utils.BindingUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 角色和菜单关联表-SysRoleMenuIServiceImpl
 *
 * @author YiFei
 * @since 2024-04-23 18:43:36
 */
@Service("sysRoleMenuService")
public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> implements ISysRoleMenuService {

    /**
     * 分配菜单权限给角色
     *
     * @param roleId  角色 id
     * @param menuIds 菜单 id 集合
     * @return 是否分配成功
     */
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public boolean saveRoleMenu(Integer roleId, Set<Integer> menuIds) {
        if (roleId == null) {
            return false;
        }

        return BindingUtil.bindEntities(
                roleId,
                menuIds,
                // 查询用户角色信息
                (id) -> this.lambdaQuery()
                        .eq(SysRoleMenu::getRoleId, id)
                        .list()
                        .stream()
                        .map(SysRoleMenu::getMenuId)
                        .collect(Collectors.toSet()),
                (id, bindIds) -> {
                    // 绑定用户角色信息
                    this.saveBatch(bindIds.stream()
                            .map(menuId -> SysRoleMenu.builder()
                                    .roleId(id)
                                    .menuId(menuId)
                                    .build())
                            .collect(Collectors.toList()));
                },
                (id, unBindIds) -> {
                    // 删除用户角色信息
                    this.lambdaUpdate()
                            .eq(SysRoleMenu::getRoleId, id)
                            .in(SysRoleMenu::getMenuId, unBindIds)
                            .remove();
                }
        );
    }

    /**
     * 获取角色的菜单ID集合
     *
     * @param roleId 角色 id
     * @return 菜单ID集合
     */
    @Override
    public List<Integer> findMenuIdsByRoleId(Integer roleId) {
        return this.lambdaQuery()
                .eq(SysRoleMenu::getRoleId, roleId)
                .list()
                .stream()
                .map(SysRoleMenu::getMenuId)
                .collect(Collectors.toList());
    }
}

